import router from './router'
import store from './store'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
NProgress.configure({ showSpinner: false })
/**
 * to 去哪里
 * from 从哪来
 * next 放行函数
 *  next() 放行
 *  next('/xxx') 去xxx
 *  next(参数) 和我们的router.push的参数语法是一致
 *      // 字符串
        router.push('home')

        // 对象
        router.push({ path: 'home' })

        // 命名的路由
        router.push({ name: 'user', params: { userId: '123' }})

        // 带查询参数，变成 /register?plan=private
        router.push({ path: 'register', query: { plan: 'private' }})

    容易出错的点
    1. 判断是否是登录页 to.path === '/login' 注意是/login 不是login
    2. 我们判断是否登录 store.getters.token 这个东西写在beforeEach还是外面
        写在外面只执行一次
        写在里面每去一个页面都会执行
 */
// console.log('写在外面只执行一次')
const whiteList = ['/login', '/404']
// 前置守卫
router.beforeEach(async(to, from, next) => {
  // 进度条开始
  NProgress.start()
  //   console.log('写在里面')
  //   console.log('写在里面')
  //   console.log(to)
  next()
  //   next()
  const token = store.getters.token
  if (token) {
    // 登录了
    if (to.path === '/login') {
      NProgress.done()

      // 登录了再去登录页 直接跳到主(首)页
      next('/')
    } else {
      // 登录了去其他页面 直接放行
      /**
       * 需求
       *  如果不做处理，我们每进一个页面都会发送请求，这样明显不合理
       *  但我们第一次肯定要发请求
       *  后续进入页面就不需要发了
       * 实现方式
       *  因为不发请求 userInfo是个空对象
       *  发了请求 不是空对象 有很多字段数据
       *  判断这个对象里有没有userId，
       *    有的话 发送过请求了
       *    没有的话 说明没发过 - 第一次需要发送请求
       *
       */
      if (!store.state.user.userInfo.userId) {
        const res = await store.dispatch('user/getUserInfo')
        console.log(res)
      }

      next()
    }
  } else {
    // 没登录
    // 判断是否去白名单
    if (whiteList.includes(to.path)) {
      // 没登录去白名单 放行
      next()
    } else {
      NProgress.done()

      // 没登录不去白名单 直接去登录页
      next('/login')
    }
  }
})
// 后置守卫
// afterEach 参数 - 回调函数 回调函数的参数就2个，一个to一个from，没有next原因是因为进入到这个页面不需要放行
router.afterEach(() => {
  // 进度条直接走完
  NProgress.done()
})
